package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.bean.Category;
import com.itheima.bean.Dish;
import com.itheima.bean.Setmeal;
import com.itheima.common.PageParam;
import com.itheima.dao.CategoryDao;
import com.itheima.dto.DishDto;
import com.itheima.exception.CustomException;
import com.itheima.service.CategoryService;
import com.itheima.service.DishService;
import com.itheima.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private DishService dishService;

    @Autowired
    private SetmealService setmealService;

    @Autowired
    private CategoryDao categoryDao;

    /**
     * 更新分类
     *
     * @param category
     * @return
     */
    @Override
    public int update(Category category) {
        return categoryDao.updateById(category);
    }

    /**
     * 添加分类
     *
     * @param category
     * @return
     */
    @Override
    public int add(Category category) {
        return categoryDao.insert(category);
    }

    /**
     * 分类分页查询
     *
     * @param pageParam
     * @return
     */
    @Override
    public IPage<Category> page(PageParam pageParam) {

        //1. 构建分页对象
        IPage<Category> p = new Page<>(pageParam.getPage() , pageParam.getPageSize());

        //2. 构建条件对象

        //3. 追加条件

        //4. 执行分页查询
        return categoryDao.selectPage(p ,null );
    }

    /**
     * 删除分类
     *  1. 删除分类和以前的删除不太一样，不能直接删除分类的数据，它需要先检查
     *  2. 检查菜品表 （dish）  和   套餐表 (setmeal)
     *      2.1 如果在菜品表里面发现有菜品属于这种分类，那么禁止删除！
     *      2.2 如果在套餐表里面发现有套餐属于这种分类，那么禁止删除！
     *  3. 具体操作：
     *      3.1 拿着分类的id去找 菜品表, 看看有没有哪些菜品属于这种分类。如果有，禁止删除
     *
     *      3.2 拿着分类的id去找 套餐表, 看看有没有哪些套餐属于这种分类，如果有，禁止删除
     * @param id
     * @return
     */
    @Override
    public int delete(Long id) {

        //1. 查询dish表，看一下是否有关联的数据
        List<DishDto> dishList = dishService.findByCategoryId(id , null);
        if(dishList.size() > 0 ){
            throw new CustomException("该分类有关联的菜品数据，禁止删除！");
        }

        //2. 查询setmeal表，看一下是否有关联的数据
        List<Setmeal> setmealList = setmealService.findByCategoryId(id);
        if(setmealList.size() > 0 ){
            throw new CustomException("该分类有关联的套餐数据，禁止删除！");
        }

        //3. 执行分类表的删除
        return categoryDao.deleteById(id);
    }


    /**
     * 根据类型值查找分类
     *
     * @param type
     * @return
     */
    @Override
    public List<Category> findByType(Integer type) {

        //1. 构建条件对象
        LambdaQueryWrapper<Category> lqw = new LambdaQueryWrapper<>();

        //2. 追加条件:: 不一定有，后端传递过来的是 1 和 2  ，前端传递过来的是 null
        lqw.eq( type != null, Category::getType ,type);

        //按照排序的序号值来排序。
        lqw.orderByAsc(Category::getSort);

        //3. 执行查询
        return categoryDao.selectList(lqw);
    }

    /**
     * 根据分类的id查询分类
     *
     * @param id
     * @return
     */
    @Override
    public Category findById(Long id) {
        return categoryDao.selectById(id);
    }
}
